package com.example.demo.config.scheduler;

import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

/**
 * Created by Mojo on 2017/9/7.
 * 定时任务：（方式二）quartz调度框架
 * 注册Spring-boot启动完成事件监听，用于启动job任务
 *
 * 继承spring的ApplicationListener监听器，并监控ContextRefreshedEvent事件（容器初始化完成事件），
 * 即当所有的Bean都初始化好之后，启动定时器。
 */
@Configuration
public class SchedulerListener implements ApplicationListener<ContextRefreshedEvent> {

	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	public MyScheduler myScheduler;

	/**
	 * 容器初始化完成后,便会执行该监听器的onApplicationEvent(ContextRefreshedEvent)方法，
	 * 它确保容器所需要的Bean都初始化完毕。
	 * @param event
	 */
	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
		try {
			logger.info("定时任务监听器，开始定时任务的调度");
			myScheduler.scheduleJobs();
		} catch (SchedulerException e) {
			logger.error("定时任务监听器异常，任务调度失败");
		}
	}

	/**
	 * 使用@Bean注解的方法不能是private、final或static的。
	 * 基于Java类定义Bean配置元数据需要CGLIB的支持，因此要保证类路径中包括CGLIB的jar包。
	 * @return
	 */
	@Bean
	public SchedulerFactoryBean schedulerFactoryBean(){
		SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
		return schedulerFactoryBean;
	}

}
